﻿using SIOGDE.AccesoDatos.Entidades;
using SIOGDE.AccesoDatos.Entidades.Lites;
using SIOGDE.AccesoDatos.Entidades.Reportes;
using SIOGDE.Negocios.Servicios;
using SIOGDE.Reportes.Negocios.Shared;
using System;
using System.Collections.Generic;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SIOGDE.Reportes.Negocios
{
    public class FilePersonalNegocios
    {
        public List<DTOPersona> GetPersonalInfo(Dictionary<string, string> param)
        {   
            int PersonaId = Convert.ToInt32(param[ReportParameterNames.PersonaId]);
            int GestionId = Convert.ToInt32(param[ReportParameterNames.GestionId]);

            Persona p = BusinessFactory.Current.GetPersonaNegocios().ObtenerPorId(PersonaId);

            DTOPersona dtoPersona = new DTOPersona();
            dtoPersona.ApellidoPaterno = !string.IsNullOrEmpty(p.ApellidoPaterno) ? p.ApellidoPaterno.ToUpper() : string.Empty;
            dtoPersona.ApellidoMaterno = !string.IsNullOrEmpty(p.ApellidoMaterno) ? p.ApellidoMaterno.ToUpper() : string.Empty; 
            dtoPersona.CI = p.CI;
            dtoPersona.CIMilitar = p.CIMilitar;
            dtoPersona.Codigo = p.Codigo;
            dtoPersona.Email = p.Email;
            dtoPersona.EsPersonaCivil = p.EsPersonaCivil;
            dtoPersona.Estatura = p.Estatura;
            dtoPersona.Etnia = p.Etnia;
            dtoPersona.FechaEgreso = p.FechaEgreso!=null?p.FechaEgreso.Value:DateTime.Now;
            dtoPersona.FechaNacimiento = p.FechaNacimiento!=null?p.FechaNacimiento.Value:DateTime.Now;
            dtoPersona.Genero = p.Genero;
            dtoPersona.LugarNacimiento = !string.IsNullOrEmpty(p.LugarNacimiento)?p.LugarNacimiento.ToUpper():string.Empty;
            dtoPersona.Nombre1 = !string.IsNullOrEmpty(p.Nombre1)?p.Nombre1.ToUpper():string.Empty;
            dtoPersona.Nombre2 = !string.IsNullOrEmpty(p.Nombre2) ? p.Nombre2.ToUpper() : string.Empty;
            dtoPersona.NumAntiguedadEgreso = p.NumAntiguedadEgreso;
            dtoPersona.Peso = p.Peso;
            dtoPersona.Raza = p.Raza;

            dtoPersona.TipoSangre = !string.IsNullOrEmpty(p.TipoSangre) ? p.TipoSangre.ToUpper() : string.Empty;
            dtoPersona.Alergias = !string.IsNullOrEmpty(p.Alergias) ? p.Alergias.ToUpper() : string.Empty; 
            dtoPersona.TelefFijo = p.TelefFijo;
            dtoPersona.TelefMovil = p.TelefMovil;
            dtoPersona.TipoVivienda = !string.IsNullOrEmpty(p.TipoVivienda) ? p.TipoVivienda.ToUpper() : string.Empty; 

            string estadocivil = !string.IsNullOrEmpty(p.NombreConyuge) ? " (" + p.NombreConyuge + ")" : string.Empty;

            dtoPersona.EstadoCivil = (!string.IsNullOrEmpty(p.EstadoCivil) ? p.EstadoCivil.ToUpper() : string.Empty) + estadocivil;
            dtoPersona.ProblemasSalud = p.ProblemasSalud;
            dtoPersona.ProfesionLibre = p.ProfesionLibre;
            dtoPersona.NumAntiguedadEntre = p.NumAntiguedadEntre;
            dtoPersona.NombreConyuge = (p.PersonaConyuge!=null)?p.PersonaConyuge.NombreCompleto.ToUpper():string.Empty;

            var especialidades = BusinessFactory.Current.GetEspecialidadNegocios().GetPorPersonaId(PersonaId).ToList();
            var grado = BusinessFactory.Current.GetGradoNegocios().GetPorPersonaId(PersonaId);
            var arma = BusinessFactory.Current.GetArmaNegocios().GetPorPersonaId(PersonaId);

            var historialAscenso = BusinessFactory.Current.GetHistorialAscensoNegocios().GetPorPersonaId(PersonaId).FirstOrDefault();

            dtoPersona.NumeroAntiguedadAscenso = historialAscenso != null ? historialAscenso.NumAntiguedad : 0;
            dtoPersona.NumAscensoEntre = historialAscenso != null ? historialAscenso.NumEntre : 0;
            dtoPersona.FechaAscenso = historialAscenso != null ? historialAscenso.FechaAscenso : new Nullable<DateTime>();

            dtoPersona.Especialidad = string.Join(", ", especialidades.Select(pobj => pobj.Nombre).ToArray());

            dtoPersona.Grado = grado!=null?(!string.IsNullOrEmpty(grado.Nombre) ? grado.Nombre.ToUpper() : string.Empty):string.Empty;
            dtoPersona.Arma = arma != null ? (!string.IsNullOrEmpty(arma.Nombre) ? arma.Nombre.ToUpper() : string.Empty) : string.Empty;
            dtoPersona.Fuerza = arma != null ?( !string.IsNullOrEmpty(arma.Fuerza.Nombre) ? arma.Fuerza.Nombre.ToUpper() : string.Empty):string.Empty; 

            DestinoAsignado destino = BusinessFactory.Current.GetDestinoAsignadoNegocios().GetDestinoActual(GestionId, PersonaId);

            if (destino != null)
            {                
                dtoPersona.DestinoActual = destino.RequerimientoConfig.UnidadMilitar.Nombre + "(" + destino.RequerimientoConfig.UnidadMilitar.Region.Nombre + ")";
                dtoPersona.RegionDestinoActual = destino.RequerimientoConfig.UnidadMilitar.Region.Nombre;

            }

            //string datoCodigo = dtoPersona.CI + "-" + dtoPersona.Grado + "-" + dtoPersona.Arma + "-" + dtoPersona.Especialidad + " " + dtoPersona.ApellidoPaterno + " " + dtoPersona.ApellidoMaterno + " " + dtoPersona.Nombre1;
            string datoCodigo = dtoPersona.CI + "-" + dtoPersona.ApellidoPaterno + " " + dtoPersona.ApellidoMaterno + " " + dtoPersona.Nombre1;
            dtoPersona.CodigoQR = Didsoft.Utils.CodeBars.Common.GenerateQRCode(datoCodigo, ImageFormat.Png);

            var media = BusinessFactory.Current.GetMediaNegocios().ObtenerPorGuid(p.Guid);
            if(media!=null)
              dtoPersona.Fotografia = media.Recurso;

            List<DTOPersona> personas = new List<DTOPersona>();
            personas.Add(dtoPersona);

            return personas;
        }


        public List<DTODestino> GetHistorialDestinos(Dictionary<string, string> param)
        {
            int PersonaId = Convert.ToInt32(param[ReportParameterNames.PersonaId]);

            var negocios = BusinessFactory.Current.GetDestinoAsignadoNegocios();
            var destinos = negocios.GetPorPersonaId(PersonaId);

            List<DTODestino> lista = new List<DTODestino>();

            foreach (var item in destinos)
            {
                if (item.RequerimientoConfig != null)
                {

                    lista.Add(new DTODestino()
                    {
                        Gestion = item.Gestion.Codigo,
                        UnidadMilitar = item.RequerimientoConfig.UnidadMilitar.Nombre,
                        PersonaGuid = item.Persona.Guid,
                        NotaFojaConcepto = 0,
                        Cargo = item.RequerimientoConfig.TipoCargoComando.Nombre
                    });
                }
                else
                {
                    lista.Add(new DTODestino()
                    {
                        Gestion = item.Gestion.Codigo,
                        UnidadMilitar = item.Observaciones ,
                        PersonaGuid = item.Persona.Guid,
                        NotaFojaConcepto = 0,
                        Cargo = "Sin Cargo Registrado"
                    });
                }
                
            }

            return lista;

        }



    }
}
